public class code2 {
// top 101 判断链表中环的入口节点

    public ListNode EntryNodeOfLoop(ListNode pHead) {
        // 上来先判断一下这里只有 head 节点的情况
        if(pHead == null || pHead.next == null) {
            return null;
        }
        // 这里依旧可以使用快慢指针来完成操作。
        // 针对三个不同的实例，有着多种情况

        // 定义两个快慢指针
        ListNode slow = pHead;
        ListNode quick = pHead;

        // 这里定义一个标记
        boolean flag = false;

        // 进行 while 循环进行环形链表的点位进行定位
        while(quick != null && quick.next != null) {
            // 进行遍历操作
            slow = slow.next;
            quick = quick.next.next;
            // 此时当出现两个指针节点位置重复的时候，进行后续操作
            if(slow == quick) {
                // 修改标志位信息
                flag = true;
                // 直接跳出循环
                break;
            }
        }
        // 此时需要先将 slow 调整到 phead 位置
        // 因为一开始设置的步长就不同，所以通过将一个节点放到 头 的位置，重新将两个指针以步长为 1 的方式进行遍历，最终都会重合在一起
        slow = pHead;
        // 之后让 quick 指针在环中循环，让 slow 指针向前移动，最终会在节点处交汇
        // 跳出循环后，在这里进行分类讨论

        if(flag) {
            // 这里判断的是 实例 3 这样的情况
            if(slow == quick) {
                return slow;
            }
            // 这里针对一般情况进行判断

            while(slow.next != null || quick.next != null) {
                slow = slow.next;
                quick = quick.next;
                if(slow == quick) {
                    return slow;
                }
            }
        }
        // 在全部判断完成的情况下，直接先返回一个 null
        return null;
    }
}
